package com.tmt.fileservice;

/**
 * Created by ThreeManTeam on 2017/5/24.
 */
public interface IFileDispatcher {

    /**
     * 获取对象属性文件的保存文件名。
     *
     * @param obj                  对象propertyName属性的值应该是Url格式的:
     *                             {BaseUrl}/{basePath|tmpBasePath}/{clsName}/{Id}/{propertyName}/{FileSuffixName}/{FileName}。
     * @param propertyName
     * @param defaultPropertyValue
     * @param <T>
     * @return 文件保存的全路径信息字符串:
     * {basePath|tmpBasePath}/{clsName}/{Id}/{propertyName}/{FileName}.{FileSuffixName}。
     */
    <T> String getFilePath(T obj, String propertyName, String defaultPropertyValue, FileSaveMode fileSaveMode);

    /**
     * 获取对象属性文件新的保存文件名。
     *
     * @param clazz
     * @param idValue       对象ID值。
     * @param propertyPath
     * @param propertyValue
     * @param fileSaveMode
     * @param <T>
     * @return
     */
    <T> String getNewFilePath(Class<T> clazz, Object idValue, String propertyPath, String propertyValue, FileSaveMode fileSaveMode);

    /**
     * 获取对象属性文件的Url访问路径。
     *
     * @param obj          对象propertyName属性的值应该是Path格式的:
     *                     {basePath|tmpBasePath}/{clsName}/{Id}/{propertyName}/{FileName}.{FileSuffixName}。
     * @param propertyName
     * @param fileSaveMode
     * @param <T>
     * @return 访问文件的Url地址信息:
     * {BaseUrl}/{basePath|tmpBasePath}/{clsName}/{Id}/{propertyName}/{FileSuffixName}/{FileName}。
     */
    <T> String getFileUrl(T obj, String propertyName, FileSaveMode fileSaveMode);

    /**
     * 将文件的Url信息转换成文件的保存信息。
     *
     * @param fileUrl
     * @return
     */
    String fileUrlToPath(String fileUrl);

    /**
     * 将文件的保存信息转换成文件的Url信息。
     *
     * @param filePath
     * @return
     */
    String filePathToUrl(String filePath);

    /**
     * 获取文件名称和文件后缀名称。
     *
     * @param fileUrlOrPath
     * @return 数组0元素放置的是文件名称，数组1元素放置的是文件后缀名称，
     */
    String[] getFileName(String fileUrlOrPath);

    /**
     * 获取效验器的名称
     *
     * @param obj
     * @param propertyName
     * @param <T>
     * @return
     */
    <T> String getValidatorName(T obj, String propertyName);

    /**
     * 获取效验器的名称
     *
     * @param filePath
     * @return
     */
    String getValidatorNameByPath(String filePath);

    /**
     * 获取效验器的名称
     *
     * @param fileUrl
     * @return
     */
    String getValidatorNameByUrl(String fileUrl);

    /**
     * 获取临时文件保存路径。
     *
     * @return
     */
    String getTmpFileDir();

    /**
     * 获取文件超时时间，单位：秒。
     *
     * @return
     */
    long getFileExpiredTime();

    /**
     * 获取ContextPath参数;
     * @return
     */
    String getContextPath();

    /**
     * 获取文件访问地址的有效Url，格式为：{protocol}://{hostAddress}:{port} 。
     *
     * @return
     */
    String getHostUrl();

    /**
     * 确保filePath参数指定的文件存在，如果不存在则到上传文件临时保存路径下去查找并拷贝到正确的位置。
     *
     * @param filePath
     */
    void tryMoveFileToMainDir(String filePath);

}
